﻿Imports Capa_de_Acceso_a_Datos

Public Class frmCargaCaratula

    Public FarmaciaId As Integer

    'TODO Validacion de que no se carguen ene el combo las OS ya cerradas    
    'TODO Si la OSXPlan lleva detalle (carga de recetas) al seleccionar la misma se deberían calcular las recetas, total facturado y a cargo OS desde la base de datos
    'TODO Controlar los valores ingresados en campos númericos    
    Private Sub btnProcesar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcesar.Click

        If CamposCompletosPeriodo() Then
            If ObraSocialCerrada() Then
                MsgBox("La obra social ya ha sido cerrada en el período especificado", MsgBoxStyle.Information, "Atención")
                Return
            End If
            gboCaratulas.Enabled = True
            gboPeriodo.Enabled = False
            CargarGrilla()

        Else
            MsgBox("Por favor complete todos los campos", MsgBoxStyle.Information, "Atención")
        End If

    End Sub

    Private Function ObraSocialCerrada() As Boolean
        Dim ObraSocialXPlanId As Integer = cboObraSocial.SelectedValue
        Dim AnoId As Integer = cboAno.SelectedValue
        Dim MesId As Integer = cboMes.SelectedValue
        Dim retorno As Boolean = False


        If CierreObraSocialDAO.ObraSocialCerrada(MesId, AnoId, ObraSocialXPlanId) Then
            retorno = True
        End If

        Return retorno
    End Function

    Private Sub CargarGrilla()
        Try
            dgvCaratulas.DataSource = CaratulaPresentacionDAO.obtenerCaratulasXOS(cboObraSocial.SelectedValue, cboAno.SelectedValue, cboMes.SelectedValue)
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try

        dgvCaratulas.Refresh()
        'dgvCaratulas.Columns("Recetas").Width = 70
        'dgvCaratulas.Columns("Facturado").Width = 70
        'dgvCaratulas.Columns("A Cargo OS").Width = 85
        'dgvCaratulas.Columns("Fecha").Width = 120
        'dgvCaratulas.Columns("Farmacia").Width = 116

        'dgvCaratulas.Columns("Fecha").ReadOnly = True
        'dgvCaratulas.Columns("Id").Visible = False
        'dgvCaratulas.Columns("Presentacion").Visible = False
        'dgvCaratulas.Columns("TipoCaratula").Visible = False
        'dgvCaratulas.Columns("FarmaciaId").Visible = False
    End Sub

    Private Function CamposCompletosPeriodo() As Boolean
        Dim retorno As Boolean = True

        If cboAno.SelectedValue Is Nothing Or cboMes.SelectedValue Is Nothing Or cboObraSocial.SelectedValue Is Nothing Then
            retorno = False
        End If

        Return retorno
    End Function

    Private Sub frmCargaCaratulas_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.Dispose()
    End Sub

    Private Sub CargaCaratulas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        FarmaciaId = -1
        CargarCombos()
        dtpFecha.Value = Date.Now

        With dgvCaratulas
            ' alternar color de filas  
            .AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite
            .DefaultCellStyle.BackColor = Color.Beige
        End With

    End Sub

    Private Sub CargarCombos()
        'Combo Año
        cboAno.ValueMember = "AnoId"
        cboAno.DisplayMember = "Ano"
        cboAno.DataSource = Constante.obtenerAnos

        'Combo Mes 
        cboMes.ValueMember = "MesId"
        cboMes.DisplayMember = "MesNombre"
        cboMes.DataSource = MesDAO.obtenerMeses(0)
        cboMes.SelectedValue = Date.Now.Month

        'Combo ObraSocialXPlan
        cboObraSocial.ValueMember = "ObraSocialXPlanId"
        cboObraSocial.DisplayMember = "Descripcion"
        cboObraSocial.DataSource = ObtenerObrasSocialesSinDetalle()

    End Sub

    Private Function ObtenerObrasSocialesSinDetalle() As DataTable
        Dim vistaOSXPlan As DataTable = ObraSocialXPlanDAO.comboObraSocialXPlan()
        Dim tablaOSXPlan As DataTable = ObraSocialXPlanDAO.obtenerObrasSocialesXPlanes(0)

        Dim OSConDetalle As ArrayList = New ArrayList()

        'Por cada fila en tablaOSXPlan pregunta si lleva detalle, en tal caso agrego el id a una lista
        For Each fila As DataRow In tablaOSXPlan.Rows
            'MsgBox("" & fila("ObraSocialXPlanLlevaDetalle") & " id " & fila("ObraSocialXPlanId"))
            If fila("ObraSocialXPlanLlevaDetalle") Then
                OSConDetalle.Add(fila("ObraSocialXPlanId"))
            End If
        Next

        'Elimino la filas de la vista que llevan detalle
        For Each id As Integer In OSConDetalle
            vistaOSXPlan.Rows.Remove((vistaOSXPlan.Select("ObraSocialXPlanId = " & id.ToString)).First)
        Next

        Return vistaOSXPlan
    End Function

    Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click        
        Me.Dispose()
    End Sub

    Private Function EstaPendienteAuditoria(ByVal PresentacionId As Integer) As Boolean
        Dim EstadoPresentacionId As Integer = PresentacionDAO.obtenerPresentaciones(PresentacionId).Rows(0)("EstadoPresentacionId")
        Dim PendienteAuditoria As Boolean = False

        'Pendiente de auditoría
        If EstadoPresentacionId = EstadoPresentacionDAO.PENDIENTE_AUDITORIA Then
            PendienteAuditoria = True
        End If

        Return PendienteAuditoria
    End Function

    Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click
        Dim PresentacionId As Integer
        Dim ObraSocialXPlanId As Integer
        Dim MesId As Integer
        Dim AñoId As Integer
        Dim CaratulaPresentacionFecha As DateTime
        Dim CaratulaPresentacionRecetas As Integer
        Dim CaratulaPresentacionTotalFacturado As Double
        Dim CaratulaPresentacionTotalCobrar As Double
        Dim TipoCaratulaId As Integer
        Dim Bonificacion As Double

        If CamposCompletosCaratula() Then
            'Obtengo el id de la presentación para la que se carga la carátula intermedia
            ObraSocialXPlanId = cboObraSocial.SelectedValue
            MesId = cboMes.SelectedValue
            AñoId = cboAno.SelectedValue

            PresentacionId = PresentacionDAO.obtenerIdPresentacion(FarmaciaId, ObraSocialXPlanId, AñoId, MesId)

            'Si existe una presentación para la obra social y farmacia seleccionada
            If PresentacionId > 0 Then

                'Controlo si la presentación  no esta pendiente de auditoría no se puede cerrar
                If Not EstaPendienteAuditoria(PresentacionId) Then
                    MsgBox("Ya existe una carátula para la farmacia seleccionada en este período de presentación", MsgBoxStyle.Critical, "Atención")
                End If


                'Controlo si ya tiene una carátula intermedia cargada (validación redundante ya que 
                'si esta pendiente de auditoría se supone que no se cargo la carátula intermedia)
                If YaTieneCaratula(PresentacionId) Then
                    MsgBox("Ya existe una carátula para la farmacia seleccionada en este período de presentación", MsgBoxStyle.Critical, "Atención")
                    Return
                End If

                'Guardamos la carátula y la mostramos en la grilla
                Try
                    CaratulaPresentacionFecha = dtpFecha.Value
                    CaratulaPresentacionRecetas = CInt(txtRecetas.Text)
                    CaratulaPresentacionTotalFacturado = CSng(txtTotalFacturado.Text)
                    CaratulaPresentacionTotalCobrar = CSng(txtACargoOS.Text)
                    Bonificacion = CDbl(txtBonificacion.Text)
                    TipoCaratulaId = 2 'Intermedia

                    If Bonificacion > 100 Then
                        MsgBox("El porcentaje no puede ser superior al 100%", MsgBoxStyle.Critical, "Atención")
                        Return
                    End If

                    If CaratulaPresentacionTotalCobrar > CaratulaPresentacionTotalFacturado Then
                        MsgBox("El total a cargo OS no puede ser superior al total facturado", MsgBoxStyle.Critical, "Atención")
                        txtACargoOS.Focus()
                        Return
                    End If
                Catch ex As Exception
                    MsgBox("Error en cast")
                End Try

                'Inserto la carátula en la BD y actualizo el estado de la presentación a cerrada
                CaratulaPresentacionDAO.insertarCaratulaPresentacion(CaratulaPresentacionFecha, CaratulaPresentacionRecetas, CaratulaPresentacionTotalFacturado, Bonificacion, CaratulaPresentacionTotalCobrar, PresentacionId, TipoCaratulaId)
                CerrarPresentacion(PresentacionId)
                registrarMovimiento(PresentacionId)
                CargarGrilla()

                'Aviso al usuario 
                MsgBox("La presentación de la farmacia en el período seleccionado ha sido cerrada", MsgBoxStyle.Information, "Atención")

            Else
                MsgBox("No existen presentaciones para la obra social y farmacia seleccionada", MsgBoxStyle.Information, "Atención")
            End If
        Else
            MsgBox("Por favor complete todos los campos", MsgBoxStyle.Critical, "Atención")
        End If

    End Sub

    Private Sub CerrarPresentacion(ByVal PresentacionId As Integer)
        Dim tablaPresentacion As DataTable = PresentacionDAO.obtenerPresentaciones(PresentacionId)

        Dim PresentacionFecha As Date = tablaPresentacion.Rows(0)("PresentacionFecha")
        Dim PresentacionAno As Integer = tablaPresentacion.Rows(0)("PresentacionAno")
        Dim MesId As Integer = tablaPresentacion.Rows(0)("MesId")
        Dim ObraSocialXPlanId As Integer = tablaPresentacion.Rows(0)("ObraSocialXPlanId")
        Dim FarmaciaId As Integer = tablaPresentacion.Rows(0)("FarmaciaId")
        Dim EmpleadoRecepcionId As Integer = tablaPresentacion.Rows(0)("EmpleadoRecepcionId")
        'Dim EmpleadoAuditorId As Integer = tablaPresentacion.Rows(0)("EmpleadoAuditorId")
        'Estado cerrada
        Dim EstadoPresentacionId As Integer = 2

        PresentacionDAO.actualizarPresentacion(PresentacionId, PresentacionFecha, PresentacionAno, MesId, EstadoPresentacionId, FarmaciaId, ObraSocialXPlanId, EmpleadoRecepcionId)
    End Sub

    Private Sub registrarMovimiento(ByVal PresentacionId As Integer)
        Dim caratulas As DataTable = CaratulaPresentacionDAO.obtenerCaratulasXPresentacion(PresentacionId)
        Dim fila As DataRow
        Dim caratulaFarmacia As Double = 0
        Dim caratulaIntermedia As Double = 0
        Dim ajuste As Double = 0
        'TipoMovimiento = Ajuste por auditoría CA.FA.PRO.
        Dim TipoAjuste As Integer = 5
        For Each fila In caratulas.Rows
            'si es original
            If fila("TipoCaratulaId") = 1 Then
                caratulaFarmacia = CDbl(fila("CaratulaPresentacionTotalCobrar").ToString())
            Else
                'si es caratula intermedia
                If fila("TipoCaratulaId") = 2 Then
                    caratulaIntermedia = CDbl(fila("CaratulaPresentacionTotalCobrar").ToString())
                End If
            End If
            ajuste = caratulaFarmacia - caratulaIntermedia
        Next
        If ajuste > 0 Then
            CuentaCorrienteDAO.CuentaCorrienteInsertarMovimiento(FarmaciaId, TipoAjuste, 0, ajuste, Today, "Cierre de presentacion " + CStr(PresentacionId))
        Else
            CuentaCorrienteDAO.CuentaCorrienteInsertarMovimiento(FarmaciaId, TipoAjuste, ajuste, 0, Today, "Cierre de presentacion " + CStr(PresentacionId))
        End If


    End Sub

    Private Function YaTieneCaratula(ByVal PresentacionId As Integer) As Boolean
        Dim Tiene As Boolean = False

        'Si ya existe una carátula intermedia para la presentación
        If CaratulaPresentacionDAO.obtenerIntermediaXPresentacion(PresentacionId).Rows.Count > 0 Then
            Tiene = True
        End If

        Return Tiene
    End Function

    Private Function CamposCompletosCaratula() As Boolean
        Dim retorno As Boolean = True

        If FarmaciaId = -1 Or txtRecetas.Text.CompareTo("") = 0 Or txtTotalFacturado.Text.CompareTo("") = 0 Or txtACargoOS.Text.CompareTo("") = 0 Or txtBonificacion.Text.CompareTo("") = 0 Then
            retorno = False
        End If

        Return retorno
    End Function

    Private Sub btnFinalizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFinalizar.Click
        LimpiarCamposCaratula()
        gboCaratulas.Enabled = False
        gboPeriodo.Enabled = True
        dgvCaratulas.DataSource = Nothing
    End Sub

    Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModificar.Click

        If btnModificar.Text.CompareTo("Modificar") = 0 Then
            'Si hay una fila seleccionada
            If HayFilaSeleccionada() Then
                btnBuscar.Enabled = False
                FarmaciaId = dgvCaratulas.SelectedRows(0).Cells("IdFarmacia").Value
                txtFarmacia.Text = FarmaciaDAO.obtenerFarmacias(FarmaciaId).Rows(0)("FarmaciaNombre")
                dtpFecha.Value = dgvCaratulas.SelectedRows(0).Cells("Fecha").Value
                txtRecetas.Text = dgvCaratulas.SelectedRows(0).Cells("Recetas").Value
                txtTotalFacturado.Text = dgvCaratulas.SelectedRows(0).Cells("Facturado").Value
                txtACargoOS.Text = dgvCaratulas.SelectedRows(0).Cells("ACargoOS").Value
                txtId.Text = dgvCaratulas.SelectedRows(0).Cells("Id").Value
                txtPresentacion.Text = dgvCaratulas.SelectedRows(0).Cells("Presentacion").Value
                txtTipoCaratula.Text = dgvCaratulas.SelectedRows(0).Cells("TipoCaratula").Value
                txtBonificacion.Text = dgvCaratulas.SelectedRows(0).Cells("Bonificacion").Value
                btnEliminar.Text = "Cancelar"
                btnModificar.Text = "Confirmar"
                btnAgregar.Visible = False
                btnFinalizar.Visible = False
            Else
                MsgBox("Seleccione primero una fila", MsgBoxStyle.Information, "Atención")
            End If
        Else
            'Confirmar
            If CamposCompletosCaratula() Then
                Try
                    Dim Fecha As DateTime = dtpFecha.Value
                    Dim CantidadRecetas As Integer = CInt(txtRecetas.Text)
                    Dim TotalFacturado As Double = CSng(txtTotalFacturado.Text)
                    Dim ACargoOS As Double = CSng(txtACargoOS.Text)
                    Dim Id As Integer = CInt(txtId.Text)
                    Dim Presentacion As Integer = CInt(txtPresentacion.Text)
                    Dim TipoCaratula As Integer = CInt(txtTipoCaratula.Text)
                    Dim Bonificacion As Double = CDbl(txtBonificacion.Text)

                    If Bonificacion > 100 Then
                        MsgBox("El porcentaje no puede ser superior al 100%", MsgBoxStyle.Critical, "Atención")
                        Return
                    End If

                    If ACargoOS > TotalFacturado Then
                        MsgBox("El total a cargo OS no puede ser superior al total facturado", MsgBoxStyle.Critical, "Atención")
                        txtACargoOS.Focus()
                        Return
                    End If

                    btnBuscar.Enabled = True
                    CaratulaPresentacionDAO.actualizarCaratulaPresentacion(Id, Fecha, CantidadRecetas, TotalFacturado, Bonificacion, ACargoOS, Presentacion, TipoCaratula)
                    CargarGrilla()
                    LimpiarCamposCaratula()
                    btnModificar.Text = "Modificar"
                    btnEliminar.Text = "Eliminar"
                    btnAgregar.Visible = True
                    btnFinalizar.Visible = True
                Catch ex As Exception
                    MsgBox("Error al convertir")
                End Try
            Else
                MsgBox("Por favor complete todos los campos", MsgBoxStyle.Critical, "Atención")
            End If

        End If
    End Sub

    Private Function HayFilaSeleccionada() As Boolean
        Dim hay As Boolean = False

        If dgvCaratulas.SelectedRows.Count > 0 Then
            hay = True
        End If

        Return hay
    End Function

    Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click

        If btnEliminar.Text.CompareTo("Eliminar") = 0 Then
            If HayFilaSeleccionada() Then
                Dim resultado As Integer = MsgBox("¿Desea eliminar la carátula seleccionada?", MsgBoxStyle.Question + MsgBoxStyle.OkCancel, "Atención")
                If resultado = MsgBoxResult.Ok Then
                    Dim CaratulaPresentacionId As Integer = dgvCaratulas.SelectedRows(0).Cells("Id").Value
                    Dim PresentacionId As Integer = CaratulaPresentacionDAO.obtenerCaratulasPresentaciones(CaratulaPresentacionId).Rows(0)("PresentacionId")
                    'Elimino la carátula y actualizo la presentación a pendiente de auditoría
                    CaratulaPresentacionDAO.eliminarCaratulaPresentacion(CaratulaPresentacionId)
                    PresentacionPendienteAuditoria(PresentacionId)
                    CargarGrilla()
                Else
                End If
            Else
                MsgBox("Seleccione primero una fila", MsgBoxStyle.Information, "Atención")
            End If
        Else
            'Cancelar
            btnBuscar.Enabled = True
            LimpiarCamposCaratula()
            btnEliminar.Text = "Eliminar"
            btnModificar.Text = "Modificar"
            btnAgregar.Visible = True
            btnFinalizar.Visible = True
        End If

    End Sub

    Private Sub PresentacionPendienteAuditoria(ByVal PresentacionId As Integer)
        Dim tablaPresentacion As DataTable = PresentacionDAO.obtenerPresentaciones(PresentacionId)

        Dim PresentacionFecha As Date = tablaPresentacion.Rows(0)("PresentacionFecha")
        Dim PresentacionAno As Integer = tablaPresentacion.Rows(0)("PresentacionAno")
        Dim MesId As Integer = tablaPresentacion.Rows(0)("MesId")
        Dim ObraSocialXPlanId As Integer = tablaPresentacion.Rows(0)("ObraSocialXPlanId")
        Dim FarmaciaId As Integer = tablaPresentacion.Rows(0)("FarmaciaId")
        Dim EmpleadoRecepcionId As Integer = tablaPresentacion.Rows(0)("EmpleadoRecepcionId")
        'Dim EmpleadoAuditorId As Integer = tablaPresentacion.Rows(0)("EmpleadoAuditorId")
        'Estado Pendiente de auditoría
        Dim EstadoPresentacionId As Integer = 1

        PresentacionDAO.actualizarPresentacion(PresentacionId, PresentacionFecha, PresentacionAno, MesId, EstadoPresentacionId, FarmaciaId, ObraSocialXPlanId, EmpleadoRecepcionId)
    End Sub

    Private Sub LimpiarCamposCaratula()
        dtpFecha.Value = Date.Now
        txtFarmacia.Text = ""
        FarmaciaId = -1
        txtRecetas.Text = ""
        txtTotalFacturado.Text = ""
        txtACargoOS.Text = ""
        txtBonificacion.Text = ""
    End Sub

    Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click
        frmSeleccionarFarmacia.frmLlamada = Me.Name
        frmSeleccionarFarmacia.ShowDialog()
    End Sub

    Private Sub ImprimirCarátulaToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImprimirCarátulaToolStripMenuItem.Click


        If Not HayFilaSeleccionada() Then
            MsgBox("Seleccione primero una carátula", MsgBoxStyle.Information, "Atención")
            Return
        End If

        'Obtengo el id de la presentación para la que se carga la carátula intermedia
        Dim ObraSocialXPlanId As Integer = cboObraSocial.SelectedValue
        Dim MesId As Integer = cboMes.SelectedValue
        Dim AñoId As Integer = cboAno.SelectedValue

        Dim PresentacionId As Integer = dgvCaratulas.SelectedRows(0).Cells("Presentacion").Value

        'Cargamos los datos que va a mostrar el reporte
        frmCierrePresentacion.PresentacionId = PresentacionId
        frmCierrePresentacion.ObraSocialXPlan = ObraSocialXPlanDAO.comboObraSocialXPlan_obtenerXId(ObraSocialXPlanId).Rows(0)("Descripcion")

        Dim IdFarmacia As Integer = dgvCaratulas.SelectedRows(0).Cells("IdFarmacia").Value
        frmCierrePresentacion.Farmacia = FarmaciaDAO.obtenerFarmacias(IdFarmacia).Rows(0)("FarmaciaNombre")
        frmCierrePresentacion.Ano = AñoId
        frmCierrePresentacion.Mes = MesDAO.obtenerMeses(MesId).Rows(0)("MesNombre")
        frmCierrePresentacion.Recetas = dgvCaratulas.SelectedRows(0).Cells("Recetas").Value
        frmCierrePresentacion.Facturado = dgvCaratulas.SelectedRows(0).Cells("Facturado").Value
        frmCierrePresentacion.ACargo = dgvCaratulas.SelectedRows(0).Cells("ACargoOS").Value
        frmCierrePresentacion.Bonificacion = dgvCaratulas.SelectedRows(0).Cells("Bonificacion").Value
        frmCierrePresentacion.PantallaLlamada = Me.Name

        frmCierrePresentacion.ShowDialog()
    End Sub

    Private Sub VisualizarPresentaciónToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VisualizarPresentaciónToolStripMenuItem.Click

        If HayFilaSeleccionada() Then

            Dim PresentacionId As Integer = dgvCaratulas.SelectedRows(0).Cells("Presentacion").Value

            frmConsultarPresentaciones.ShowDialog()


        Else
            MsgBox("Seleccione primero una carátula", MsgBoxStyle.Information, "Atención")
        End If

    End Sub

End Class
